package com.example.javamaday.common;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 反射实践类
 */
public class ReflectTestClass {

    private final int number = 100;

    private void init() {
        System.out.println("do init");
    }

    public void printNumber() {
        System.out.println("number = " + number);
    }
}

// 可以看出来反射能修改final的数据，但是当我们调用printNumber() 时，控制台打印的却是"100"。
// 这是因为JVM做了优化处理， 当一个数据域被final修饰,那就表明这个数据域是常量，
// JVM会把所有数据域出现的地方全部用"100"替换掉， 其实就是方法被优化成了这样。
class ReflectTestDemo {

    public static void main(String[] args) {
        try {
            ReflectTestClass reflectTestClass = new ReflectTestClass();
            Method method = ReflectTestClass.class.getDeclaredMethod("init");
            method.setAccessible(true);
            method.invoke(reflectTestClass);

            Field field = ReflectTestClass.class.getDeclaredField("number");
            field.setAccessible(true);
            field.setInt(reflectTestClass, 200);
            System.out.println(field.get(reflectTestClass));
            reflectTestClass.printNumber();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
